package com.hl.card.common.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hl.card.common.util.MD5Tools;
import io.netty.util.internal.StringUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;

/**
 * java类简单作用描述
 *
 * @ProjectName: payment_center
 * @Package: org.xxpay.shop.controller
 * @ClassName: ${TYPE_NAME}
 * @Description: java类作用描述
 * @Author: 作者姓名
 * @CreateDate: 2018/3/28 14:35
 * @UpdateUser: Neil.Zhou
 * @UpdateDate: 2018/3/28 14:35
 * @UpdateRemark: The modified content
 * @Version: 1.0
 * <p>Copyright: Copyright (c) 2018</p>
 */ 
@Configuration
@PropertySource(value = {"classpath:/config/dismemberapply.properties"},ignoreResourceNotFound = true,encoding = "utf-8")
public class PayUtils {
    //深圳航旅，对应支付后台管理里中的商户ID（注意，这里不是微信支付里的商户ID，而是我们的自定义的商户，比如比比旅行需要接入支付中心，我们就需要为比比旅行创建一个商户）
    @Value("${dismemberapply.pay.mchId}")
    private String mchId;
    // 加签key，支付中心给商户创建的对应reqKey，请接入商户妥善保存。
    @Value("${dismemberapply.pay.reqKey}")
    private String reqKey ;//
    // 验签key，支付中心给商户创建的对应resKey，请接入商户妥善保存。
    @Value("${dismemberapply.pay.resKey}")
    private String resKey;//
    //支付中心接口的地址
    @Value("${dismemberapply.pay.baseUrl}")
    private String baseUrl;
    //接入商户的异步通知地址，用于接收支付中心支付结果通知
    @Value("${dismemberapply.pay.notifyUrl}")
    private String notifyUrl;
    //商户业务跳转地址，请根据实际业务进行配置
    @Value("${dismemberapply.pay.shopRedirectUrl}")
    private String shopRedirectUrl;
    //atomiclong 可以理解是加了synchronized的long，用于多线程开发中保证数据的一致性，这里其实时用来生成id的，关于ID，其实可以由一个专门的服务来全局负责，本写法只是简单演示，不作为标准
    private AtomicLong seq = new AtomicLong(0L);

    @Value("${dismemberapply.cardaward.mchId}")
    private String cardaward_mchId;
    // 加签key，支付中心给商户创建的对应reqKey，请接入商户妥善保存。
    @Value("${dismemberapply.cardaward.reqKey}")
    private String cardaward_reqKey ;//
    // 验签key，支付中心给商户创建的对应resKey，请接入商户妥善保存。
    @Value("${dismemberapply.cardaward.resKey}")
    private String cardaward_resKey;//
    //支付中心接口的地址
    @Value("${dismemberapply.cardaward.baseUrl}")
    private String cardaward_baseUrl;

    @Value("${dismemberapply.hlaward.mchId}")
    private String hlaward_mchId;
    // 加签key，支付中心给商户创建的对应reqKey，请接入商户妥善保存。
    @Value("${dismemberapply.hlaward.reqKey}")
    private String hlaward_reqKey ;//
    // 验签key，支付中心给商户创建的对应resKey，请接入商户妥善保存。
    @Value("${dismemberapply.hlaward.resKey}")
    private String hlaward_resKey;//
    //支付中心接口的地址
    @Value("${dismemberapply.hlaward.baseUrl}")
    private String hlaward_baseUrl;
    /*
    * 对通过buy接口生成的商品进行支付，传入商品ID即可
    * 支付渠道channelId如下：
    * WX_NATIVE(微信扫码),
    * WX_JSAPI(微信公众号或微信小程序),
    * WX_APP(微信APP),
    * WX_MWEB(微信H5),
    * ALIPAY_WAP(支付宝手机支付),
    * ALIPAY_PC(支付宝网站支付),
    * ALIPAY_MOBILE(支付宝移动支付)
    * UNION_PC(银联网页支付)
    * UNION_WAP(银联移动支付)
    * 请求示例：http://pay.bibi321.com/pay?goodsOrderId=095809056978096&channelId=ALIPAY_WAP&redirect=http://m.bibi321.com
    * */

    /**
     * 支付接口
     * @param goodsOrderId
     * @param channelId
     * @param redirect 
     * @return
     */
    public String pay(String ip,String goodsOrderId,BigDecimal amount,String subject,String body,String channelId,String redirect,String param1,String param2,String business_type,String begin_time,String openId,String user_id) {
        JSONObject paramMap = new JSONObject();
        paramMap.put("mchId", mchId);                       // 商户ID
        paramMap.put("mchOrderNo", goodsOrderId);           // 商户订单号
        paramMap.put("channelId", channelId);             // 支付渠道ID, WX_NATIVE,ALIPAY_WAP，支付渠道ID配合商户ID就能决定唯一支付渠道信息
        paramMap.put("amount", amount.multiply(new BigDecimal(100)).setScale(0));                          // 支付金额,单位分
        paramMap.put("currency", "cny");                    // 币种, cny-人民币
        paramMap.put("clientIp", ip);        // 用户地址,IP或手机号，严格意义上该参数由业务前端传入
        paramMap.put("openId", openId); 
        paramMap.put("device", "WEB");                      // 设备
        paramMap.put("subject", subject);    //建议放置商品标题信息
        paramMap.put("body", body);   //建议放置商品详情描述
        paramMap.put("notifyUrl", redirect);               // 回调URL，用于支付中心通知接入商户支付结果
        paramMap.put("param1", "{\"code\":\""+business_type+"\",\"begin_time\":\""+begin_time+"\",\"user_id\":\""+user_id+"\"}");  //业务种类和业务开始时间        // 扩展参数1,目前可以用于商户扩展信息，支付中心对该参数直接保存，不做任何处理,如果商户需要透传json等字符串，建议经过base64等转换后传入
        paramMap.put("param2", param2);         // 扩展参数2,目前可以用于商户扩展信息，支付中心对该参数直接保存，不做任何处理，如果商户需要透传json等字符串，建议经过base64等转换后传入
        paramMap.put("extra", "{\"productId\":\"120989823\",\"openId\":\""+openId+"\"}");  // 附加参数，productId也应该前端传入，这里应该是goodsId，这里的openId应该前端业务传入
        paramMap.put("redirectUrl", shopRedirectUrl);                         // 重定向地址,为空表示使用支付中心默认页面
        String reqSign =getSign(paramMap, reqKey);
        paramMap.put("sign", reqSign);   // 签名
        //String reqData = "params=" + paramMap.toJSONString();
        //System.out.println("请求支付中心下单接口,请求数据:" + reqData);
        String url = baseUrl + "/pay/create_order?";
        //http请求请
        Map paramsMap = new HashMap();
        paramsMap.put("params", paramMap.toJSONString());
        String result = HttpURLClient.post(paramsMap, url);//向支付中心发起支付请求，支付中心在验证签名正确并争取获取到支付渠道详细信息后向第三方支付渠道进行正式下单，这里是同步方式下单。
        System.out.println("请求支付中心下单接口,响应数据:" + result);
        Map retMap = JSON.parseObject(result);
        if ("SUCCESS".equals(retMap.get("retCode"))) {
        	return result;
        }else
        {
        	   return "";
        }
      
    }

    /*
    * 支付失败的订单按原路径重新发起支付，亦可通过channelId来指定重新支付的渠道
    * mchId：商户ID，商户在接入支付中心时由支付中心分配的一个唯一ID，必填
    * mchOrderNo商户订单号（如商户自定义的商品订单号），商户自己管理，必填
    * payOrderId：支付中心订单号（下单成功后返回的订单号），可选，建议都填写完整
    * channelId：支付渠道选择参数，可选，如果参数为空，表示使用订单原支付渠道支付
    * redirct：业务重定向地址，可选，建议都填写完整
    * */
    public String rePay(String mchOrderNo,String payOrderId, String channelId, String redirect,String ip,String openId) {
        JSONObject paramMap = new JSONObject();
        paramMap.put("mchId", mchId);                               // 商户ID
        paramMap.put("mchOrderNo", mchOrderNo);                     // 商户订单号
        paramMap.put("payOrderId", payOrderId);                     // 支付订单号
        paramMap.put("channelId", channelId);                     // 支付渠道，如果该参数为空，就默认使用原支付路径支付
        paramMap.put("clientIp", ip); 
        paramMap.put("openId", openId); 
        paramMap.put("executeNotify", "true");                      // 是否执行回调,true或false,如果为true当订单状态为支付成功(2)时,支付中心会再次回调一次业务系统
        paramMap.put("redirectUrl", shopRedirectUrl);//业务重定向地址

        String reqSign = getSign(paramMap, reqKey);
        paramMap.put("sign", reqSign);                              // 签名
        String reqData = "params=" + paramMap.toJSONString();
        System.out.println("请求支付中心查单接口,请求数据:" + reqData);
        String url = baseUrl + "/pay/repay?";
        Map paramsMap = new HashMap();
        paramsMap.put("params", paramMap.toJSONString());
        String result = HttpURLClient.post(paramsMap, url);
        System.out.println("请求支付中心查单接口,响应数据:" + result);
        Map retMap = JSON.parseObject(result);
        if ("SUCCESS".equals(retMap.get("retCode"))) {
        	return result;
        }else
        {
        	return "";
        }
    }
     
     /**
      * 退款接口
      * @param mchOrderNo
      * @param payOrderId
      * @return
      */
    //商户订单号mchOrderNo, 和支付中心订单号payOrderId 两个参数不能同时为空
    public String refundOrder(String mchRefundNo,String mchOrderNo,String channelId,BigDecimal amount,String ip,String subject,String body,String param1,String param2,String payOrderId,String business_type,String begin_time,String redirect) {
    	if(mchRefundNo==null||"".equals(mchRefundNo))
    	{
    		SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
    		int a = (int) (Math.random() * 900) + 100;
    		 mchRefundNo=format.format(new Date()) + a;   //退款流水号
    	}
    	
    	JSONObject paramMap = new JSONObject();
        paramMap.put("mchId", mchId);                               // 商户ID
        paramMap.put("mchRefundNo", mchRefundNo);     //退款序号
        paramMap.put("mchOrderNo", mchOrderNo);     // 商户订单号"G20180226141222000001"
        // 支付渠道ID, WX_NATIVE(微信扫码),WX_JSAPI(微信公众号或微信小程序),WX_APP(微信APP),WX_MWEB(微信H5),ALIPAY_WAP(支付宝手机支付),ALIPAY_PC(支付宝网站支付),ALIPAY_MOBILE(支付宝移动支付)
        paramMap.put("channelId",channelId);   // ALIPAY_MOBILE，WX_NATIVE,ALIPAY_WAP，支付渠道ID配合商户ID就能决定唯一支付渠道信息
        paramMap.put("amount", amount.multiply(new BigDecimal(100)).setScale(0));  // 退款金额
        paramMap.put("currency", "cny");                            // 币种, cny-人民币
        paramMap.put("clientIp", ip);                 // 用户地址,微信H5支付时要真实的
        paramMap.put("device", "WEB");                              // 设备
        paramMap.put("subject", subject);
        paramMap.put("body", body);
        paramMap.put("notifyUrl", redirect);                       // 异步回调URL
        paramMap.put("param1", "{\"code\":\""+business_type+"\",\"begin_time\":\""+begin_time+"\"}");                                 // 扩展参数1
        paramMap.put("param2", param2);                                 // 扩展参数2
        paramMap.put("channelUser", "user");
        paramMap.put("payOrderId", payOrderId);


        //{"h5_info": {"type":"Wap","wap_url": "https://pay.qq.com","wap_name": "腾讯充值"}}

        String reqSign = getSign(paramMap, reqKey);
        paramMap.put("sign", reqSign);                              // 签名
        String reqData = "params=" + paramMap.toJSONString();
        System.out.println("请求支付中心退款接口,请求数据:" + reqData);
        String url = baseUrl + "/refund/queue?";
        Map paramsMap = new HashMap();
        paramsMap.put("params", paramMap.toJSONString());
        String result= HttpURLClient.post(paramsMap, url);
        System.out.println("请求支付中心退款接口,响应数据:" + result);
        Map retMap = JSON.parseObject(result);
        if("SUCCESS".equals(retMap.get("retCode")) && "SUCCESS".equalsIgnoreCase(retMap.get("resCode").toString())) {
        	System.out.println("退款成功");
            return   "success";
        }else
        {
        	return "fail";
        }
    }

    public JSONObject transBidouByOrder(String userId, String userName, JSONObject order) {
        JSONObject paramMap = new JSONObject();
        System.out.println("比豆转账请求参数：" + order.toJSONString());
        paramMap.put("mchId", mchId);                               // 商户ID
        paramMap.put("mchTransNo", order.getString("merchantOrderNumber"));     // 商户订单号
        // 支付渠道ID, WX_NATIVE(微信扫码),WX_JSAPI(微信公众号或微信小程序),WX_APP(微信APP),WX_MWEB(微信H5),ALIPAY_WAP(支付宝手机支付),ALIPAY_PC(支付宝网站支付),ALIPAY_MOBILE(支付宝移动支付)
        paramMap.put("channelId", order.getString("channelId"));
        paramMap.put("amount", order.getString("orderAmount"));                                  // 转行金额,单位分
        paramMap.put("currency", order.getString("currency"));                            // 币种, cny-人民币 bd-比豆 htl
        paramMap.put("clientIp", "211.94.116.218");                 // 用户地址,微信H5支付时要真实的
        paramMap.put("device", "WEB");                              // 设备
        paramMap.put("subject", order.getString("productType"));
        paramMap.put("body", order.getString("productType"));
        paramMap.put("notifyUrl", notifyUrl);                       // 回调URL
        paramMap.put("param1", order.toJSONString());                                 // 扩展参数1, 记录了比豆分配参数
        paramMap.put("param2", "");                                 // 扩展参数2, 其他扩展信息
        paramMap.put("channelUser", userId);
        paramMap.put("UserName", userName);
        paramMap.put("remarkInfo", "比豆奖励转账");

        String reqSign = getSign(paramMap, reqKey);
        paramMap.put("sign", reqSign);                              // 签名
        String reqData = "params=" + paramMap.toJSONString();
        System.out.println("请求支付中心转账接口,请求数据:" + reqData);
        String url = baseUrl + "/trans/create_order?";
        Map paramsMap = new HashMap();
        paramsMap.put("params", paramMap.toJSONString());
        String result = HttpURLClient.post(paramsMap, url);
        System.out.println("请求支付中心转账接口,响应数据:" + result);
        JSONObject resultObj = JSON.parseObject(result);
        return resultObj;
    }

    public JSONObject hlawardByTrans(String userId, String userName, JSONObject order) {
        JSONObject paramMap = new JSONObject();
        System.out.println("比豆转账请求参数：" + order.toJSONString());
        paramMap.put("mchId", hlaward_mchId);                               // 商户ID
        paramMap.put("mchTransNo", order.getString("merchantOrderNumber"));     // 商户订单号
        // 支付渠道ID, WX_NATIVE(微信扫码),WX_JSAPI(微信公众号或微信小程序),WX_APP(微信APP),WX_MWEB(微信H5),ALIPAY_WAP(支付宝手机支付),ALIPAY_PC(支付宝网站支付),ALIPAY_MOBILE(支付宝移动支付)
        paramMap.put("channelId", order.getString("channelId"));
        paramMap.put("amount", order.getString("orderAmount"));                                  // 转行金额,单位分
        paramMap.put("currency", order.getString("currency"));                            // 币种, cny-人民币 bd-比豆 htl
        paramMap.put("clientIp", "127.0.0.1");                 // 用户地址,微信H5支付时要真实的
        paramMap.put("device", "WEB");                              // 设备
        paramMap.put("subject", order.getString("productType"));
        paramMap.put("body", order.getString("productType"));
        paramMap.put("notifyUrl", notifyUrl);                       // 回调URL

        String productCode = order.getString("flag");
        String productName = order.getString("productType");
        String parentProductCode = order.getString("parentFlag");
        String parentProductName = order.getString("parentProductType");

        JSONObject productInfo = new JSONObject();
        productInfo.put("code", productCode);
        productInfo.put("productName", productName);
        String tripTime =  order.getString("tripTime");
        if(StringUtils.isNotBlank(tripTime)) {
            if("manual".equals(tripTime)) {
                tripTime = "1900-01-01 00:00:00";
            }
        }
        productInfo.put("begin_time", tripTime);
        paramMap.put("param1", productInfo.toJSONString());                                 // 扩展参数1, 记录了比豆分配参数                                 // 扩展参数1, 记录了比豆分配参数

        JSONArray userList = order.getJSONArray("settleList");
//        JSONObject user = new JSONObject();
//        user.put("userId", order.getString("userId"));
//        user.put("phone", order.getString("loginAccount"));
//        user.put("amount", order.getString("userAmount"));
//        user.put("comment", order.getString(productName) + ":" + order.getString(productCode));
//        userList.add(user);
//        String parentUserId = order.getString("proxyNumber");
//        if(StringUtils.isNotBlank(parentUserId)) {
//            JSONObject parent = new JSONObject();
//            parent.put("userId", parentUserId);
//            parent.put("phone", order.getString("proxyPhone"));
//            parent.put("amount", order.getString("partnerAmount"));
//            parent.put("comment", order.getString(parentProductName) + ":" + order.getString(parentProductCode));
//            userList.add(parent);
//        }

        paramMap.put("param2", userList.toJSONString());                                 // 扩展参数2, 其他扩展信息
        paramMap.put("channelUser", userId);
        paramMap.put("UserName", userName);
        paramMap.put("remarkInfo", productName);

        String reqSign = getSign(paramMap, hlaward_reqKey);
        paramMap.put("sign", reqSign);                              // 签名
        String reqData = "params=" + paramMap.toJSONString();
        System.out.println("请求支付中心转账接口,请求数据:" + reqData);
        String url = hlaward_baseUrl + "/trans/create_order?";
        Map paramsMap = new HashMap();
        paramsMap.put("params", paramMap.toJSONString());
        System.out.println("比豆转账请求URL：" + url);
        String result = HttpURLClient.post(paramsMap, url);
        System.out.println("请求支付中心转账接口,响应数据:" + result);
        JSONObject resultObj = JSON.parseObject(result);
        return resultObj;
    }

    public JSONObject awardByTrans(String userId, String userName, JSONObject order) {
        JSONObject paramMap = new JSONObject();
        System.out.println("比豆转账请求参数：" + order.toJSONString());
        paramMap.put("mchId", cardaward_mchId);                               // 商户ID
        paramMap.put("mchTransNo", order.getString("merchantOrderNumber"));     // 商户订单号
        // 支付渠道ID, WX_NATIVE(微信扫码),WX_JSAPI(微信公众号或微信小程序),WX_APP(微信APP),WX_MWEB(微信H5),ALIPAY_WAP(支付宝手机支付),ALIPAY_PC(支付宝网站支付),ALIPAY_MOBILE(支付宝移动支付)
        paramMap.put("channelId", order.getString("channelId"));
        paramMap.put("amount", order.getString("orderAmount"));                                  // 转行金额,单位分
        paramMap.put("currency", order.getString("currency"));                            // 币种, cny-人民币 bd-比豆 htl
        paramMap.put("clientIp", "127.0.0.1");                 // 用户地址,微信H5支付时要真实的
        paramMap.put("device", "WEB");                              // 设备
        paramMap.put("subject", order.getString("productType"));
        paramMap.put("body", order.getString("productType"));
        paramMap.put("notifyUrl", notifyUrl);                       // 回调URL

        String productCode = order.getString("flag");
        String productName = order.getString("productType");
        String parentProductCode = order.getString("parentFlag");
        String parentProductName = order.getString("parentProductType");

        JSONObject productInfo = new JSONObject();
        productInfo.put("code", productCode);
        productInfo.put("productName", productName);
        productInfo.put("begin_time", order.getString("tripTime"));
        paramMap.put("param1", productInfo.toJSONString());                                 // 扩展参数1, 记录了比豆分配参数

        JSONArray userList = order.getJSONArray("settleList");
//        JSONObject user = new JSONObject();
//        user.put("userId", order.getString("userId"));
//        user.put("phone", order.getString("loginAccount"));
//        user.put("amount", order.getString("userAmount"));
//        user.put("comment", order.getString(productName) + ":" + order.getString(productCode));
//        userList.add(user);
//        String parentUserId = order.getString("proxyNumber");
//        if(StringUtils.isNotBlank(parentUserId)) {
//            JSONObject parent = new JSONObject();
//            parent.put("userId", parentUserId);
//            parent.put("phone", order.getString("proxyPhone"));
//            parent.put("amount", order.getString("partnerAmount"));
//            parent.put("comment", order.getString(parentProductName) + ":" + order.getString(parentProductCode));
//            userList.add(parent);
//        }

        paramMap.put("param2", userList.toJSONString());                                 // 扩展参数2, 其他扩展信息
        paramMap.put("channelUser", userId);
        paramMap.put("UserName", userName);
        paramMap.put("remarkInfo", productName);

        String reqSign = getSign(paramMap, cardaward_reqKey);
        paramMap.put("sign", reqSign);                              // 签名
        String reqData = "params=" + paramMap.toJSONString();
        System.out.println("请求支付中心转账接口,请求数据:" + reqData);
        String url = cardaward_baseUrl + "/trans/create_order?";
        Map paramsMap = new HashMap();
        paramsMap.put("params", paramMap.toJSONString());
        System.out.println("比豆转账请求URL：" + url);
        String result = HttpURLClient.post(paramsMap, url);
        System.out.println("请求支付中心转账接口,响应数据:" + result);
        JSONObject resultObj = JSON.parseObject(result);
        return resultObj;
    }

    public JSONObject refundBidouAward(JSONObject order) {
        JSONObject paramMap = new JSONObject();
        System.out.println("比豆奖励退款请求参数：" + order.toJSONString());
        paramMap.put("mchId", mchId);                               // 商户ID
        paramMap.put("mchRefundNo", "R" + order.getString("merchantOrderNumber"));     // 商户订单号
        paramMap.put("mchOrderNo", order.getString("merchantOrderNumber"));     // 商户订单号
        // 支付渠道ID, WX_NATIVE(微信扫码),WX_JSAPI(微信公众号或微信小程序),WX_APP(微信APP),WX_MWEB(微信H5),ALIPAY_WAP(支付宝手机支付),ALIPAY_PC(支付宝网站支付),ALIPAY_MOBILE(支付宝移动支付)
        paramMap.put("channelId", order.getString("channelId"));
        paramMap.put("amount", order.getString("orderAmount"));  // 退款金额
        paramMap.put("currency", order.getString("currency"));                            // 币种, cny-人民币
        paramMap.put("clientIp", "211.94.116.218");                 // 用户地址,微信H5支付时要真实的
        paramMap.put("device", "WEB");                              // 设备
        paramMap.put("subject", order.getString("productType"));
        paramMap.put("body", order.getString("productType"));
        paramMap.put("notifyUrl", notifyUrl);                       // 回调URL
        paramMap.put("param1", order.toJSONString());                                 // 扩展参数1
        paramMap.put("param2", "");                                 // 扩展参数2
        paramMap.put("channelUser", "hl");
        paramMap.put("payOrderId", order.getString("merchantOrderNumber"));

        String reqSign = getSign(paramMap, reqKey);
        paramMap.put("sign", reqSign);                              // 签名
        String reqData = "params=" + paramMap.toJSONString();
        System.out.println("请求支付中心退款接口,请求数据:" + reqData);
        String url = baseUrl + "/refund/create_order?";
        Map paramsMap = new HashMap();
        paramsMap.put("params", paramMap.toJSONString());
        String result = HttpURLClient.post(paramsMap, url);
        System.out.println("请求支付中心退款接口,响应数据:" + result);
        JSONObject resultObj = JSON.parseObject(result);
        return resultObj;
    }

    /**
     * @param map
     * @param key
     * @param notContains 不包含的签名字段
     * @return
     */
    public static String getSign(Map<String,Object> map, String key){
		ArrayList<String> list = new ArrayList<String>();
		for(Map.Entry<String,Object> entry:map.entrySet()){
			if(!"".equals(entry.getValue()) && entry.getValue() != null){
				list.add(entry.getKey() + "=" + entry.getValue() + "&");
			}
		}
		int size = list.size();
		String [] arrayToSort = list.toArray(new String[size]);
		Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < size; i ++) {
			sb.append(arrayToSort[i]);
		}
		String result = sb.toString();
		result += "key=" + key;
		result = MD5Tools.md5(result).toUpperCase();
		return result;
	}
    /**
     *
     * @param map
     * @param key
     * @param notContains 不包含的签名字段
     * @return
     */
    public static String getSign(Map<String,Object> map, String key, String... notContains){
        Map<String,Object> newMap = new HashMap<String,Object>();
        for(Map.Entry<String,Object> entry:map.entrySet()){
            boolean isContain = false;
            for(int i=0; i<notContains.length; i++) {
                if(entry.getKey().equals(notContains[i])) {
                    isContain = true;
                    break;
                }
            }
            if(!isContain) {
                newMap.put(entry.getKey(), entry.getValue());
            }
        }
        return getSign(newMap, key);
    }
   
}


